/**
 * 解读 express中引用的  etag包  生成etag字符串规则
 * @link https://github.com/jshttp/etag/blob/master/index.js
 */

import fs from 'node:fs'
import path from 'node:path'
import crypto from 'node:crypto'

const target = path.resolve(process.cwd(), 'public/a.jpg')

let stat = fs.statSync(target)

/**

 {
  dev: 2793138336,
  mode: 33206,
  nlink: 1,
  uid: 0,
  gid: 0,
  rdev: 0,
  blksize: 4096,
  ino: 562949957034338,
  size: 46529,
  blocks: 96,
  atimeMs: 1710473349081.0437,
  mtimeMs: 1710417057938.663,
  ctimeMs: 1710417057938.663,
  birthtimeMs: 1710470070498.823,
  atime: 2024-03-15T03:29:09.081Z,
  mtime: 2024-03-14T11:50:57.939Z,
  ctime: 2024-03-14T11:50:57.939Z,
  birthtime: 2024-03-15T02:34:30.499Z
}

 */
console.log(stat);

/**
 * 创建一个 Stats的 ETag
 * @param {fs.Stats} stat
 * @returns
 */
function stattag (stat) {
  // 文件的修改时间的 16进制
  let mtime = stat.mtime.getTime().toString(16)
  // 文件大小的16进制
  let size = stat.size.toString(16)

  return `"${size}-${mtime}"`
}

// "b5c1-18e3ccd1893"
let reuslt = stattag(stat)

// express 案例生成的 这个文件的 ETag值： W/"b5c1-18e3ccd1893"

// 拼接固定的 W/

// console.log('结果', reuslt);

// 如果不是 Stats 类型 则，使用另一种方式创建 ETag， 这都是可以判断的， 文件属于Stats类型

/**
 * 生成一个 etag
 *
 * @param {Buffer|string} entity  传入的内容是字符串或者 Buffer
 * @return {string}
 * @private
 */

function entitytag (entity) {
  if (entity.length === 0) {
    // fast-path empty
    return '"0-2jmj7l5rSw0yVb/vlWAYkK/YBwk"'
  }

  // 计算内容的 hash
  var hash = crypto
    .createHash('sha1')
    .update(entity, 'utf8')
    .digest('base64')
    .substring(0, 27)

  // compute length of entity
  var len = typeof entity === 'string'
    ? Buffer.byteLength(entity, 'utf8')
    : entity.length

  // 返回字符串长度的16进制 + hash值
  return '"' + len.toString(16) + '-' + hash + '"'
}

// "6-y9qBkVahpe7a043GSHG4yhV9+ZQ"
console.log(entitytag('test-1'));